/*
Day1所写的代码都是单进程/线程的，这里利用进程池技术来写一个多线程+ one loop per thread
的echo demo. 当然整体的性能不会太好，主要是学习了解一下相关的功能
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <netinet/in.h>
#include <fcntl.h> //包含fork()等功能
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <arpa/inet.h>

#include "processpool.h"
#include "echo.h"
int main(int argc,char* argv[]){
    if(argc<=2){
        printf("Usage:%s ip_address portname\n",argv[0]);
        return 0;
    }
    const char* ip=argv[1];
    int port=atoi(argv[2]);

    int listenfd=socket(PF_INET,SOCK_STREAM,0);
    assert(listenfd>=1);

    struct sockaddr_in address;
    memset(&address,0,sizeof(address));
    address.sin_family=AF_INET;
    address.sin_port=htons(port);
    inet_pton(AF_INET,ip,&address.sin_addr);

    int ret=0;
    ret=bind(listenfd,(struct sockaddr*)(&address),sizeof(address));
    assert(ret!=-1);

    ret=listen(listenfd,5);
    assert(ret!=-1);

    processpool<echo>* pool=processpool<echo>::create(listenfd,8);
    pool->run();

    close(listenfd);
    return 0;
}

/*
编译时要加上 -lstdc++,不然new[]和delete[]会报错未定义

使用方法:
服务器打开./main.o 127.0.0.1 2024
客户端使用 nc 127.0.0.1 2024连接，可以支持多个用户连接，客户端连接时会在服务端显示，发送时服务端也会显示
只是目前还没有实现客户端断开时服务端显示对应消息，显示的还是客户端发消息时一样的消息child x has recv msg
*/